//  /=============================================================/
//  |   Auteurs  : J.JULLIEN / R.HERLEMAN / R.CHAILAN             |
//  |   Fichier  : variable.c                                     |
//  |   Date     : 12/04/2009                                     |
//  |   Objet    : Définition du type "t_Variable" &              |
//  |              ses fonctions associées                        |
//  /=============================================================/

#include "variable.h"

/* ------------------------------------------------------------------------ */
/* -------------------- Définition fonctions exportées -------------------- */
/* ------------------------------------------------------------------------ */

t_Variable variableInit(int num) {
  t_Variable v;
  
  v.numVariable = num;
  v.litteral = NULL;
  v.val = -1; // Initialisé à neutre
  v.nbNeutres = 0;
  v.nbSatisfaits = 0;
  v.nbFalsifies = 0;
  
  return v;
}

void variableMAJCompteurs (t_Variable* v, t_Litteral l, int nouvelleVal) {
  int ancienneVal = litteralGetValeur(l, v->val);
  if (ancienneVal == 0) {
    v->nbFalsifies--;
  } else {
    if (ancienneVal == 1) {
      v->nbSatisfaits--;
    } else {
      v->nbNeutres--;
    }
  }
  
  if (litteralGetValeur(l, nouvelleVal) == 0) {
    v->nbFalsifies++;
  } else {
    if (litteralGetValeur(l, nouvelleVal) == 1) {
      v->nbSatisfaits++;
    } else {
      v->nbNeutres++;
    }
  }
}

void variableSetValeur (t_Variable *var, int val) {
  var->val = val;
}

int variableGetValeur (t_Variable var) {
  return var.val;
}

void variableAjouterLitteral(t_Variable *var, t_Litteral *lit) {
  if (variableEstVide(*var)) {
    var->litteral = lit;
  } else {
    var->dernierLitteral->clauseSuiv = lit;
  }
  var->dernierLitteral = lit;
  var->nbNeutres++;
}

t_Litteral* variableGetLitteral(t_Variable var) {
  return var.litteral;
}

int variableEstVide(t_Variable var) {
  return var.litteral == NULL;
}

void variableAfficherDebug (t_Variable v) {
  printf("Variable %d\n", v.numVariable);
  
  printf("  Valeur : %d\n", v.val);
  printf("  NbNeutres : %d\n", v.nbNeutres);
  printf("  NbSatisfaits : %d\n", v.nbSatisfaits);
  printf("  NbFalsifiés : %d\n", v.nbFalsifies);
  printf("  Litteraux : ");
  t_Litteral *l = variableGetLitteral(v);
  while (l != NULL) {
    litteralAfficherDebug(*l, 1, v.val);
    l = l->clauseSuiv;
  }
  printf("\n");
}

void variableAfficherValeur (t_Variable v) {
  printf("La variable %d a pour valeur %d\n", v.numVariable, v.val);
}
